package tonytech.wordcode.service;

import java.io.File;
import java.util.LinkedList;
import java.util.List;
import java.util.function.Consumer;

/**
 * Created by hkl
 * 这是一个文件目录扫描抽象类，使用的是模板方法模式，用户可以自定义
 * 本类形成的对象属于一次性对象，一个对象只能扫描一次
 */
public abstract class AbstractDirectoryScannerService {
    protected List<File> filesInTheRootDirectoryList;
    protected List<File> directoriesInTheRootDirectoryList;
    private File rootDirectory;

    protected AbstractDirectoryScannerService(File rootDirectory) {
        this.rootDirectory = rootDirectory;
    }
    /**
     * 主要的方法，扫描 rootDirectory
     */
    protected void scanDirectory(){
        // list不为null，表示已经扫描过，则不用二次扫描。
        if (filesInTheRootDirectoryList!=null&&directoriesInTheRootDirectoryList!=null) {
            return;
        }
        filesInTheRootDirectoryList = new LinkedList<>();
        directoriesInTheRootDirectoryList = new LinkedList<>();
        getFilesScanningMethod(filesInTheRootDirectoryList).accept(rootDirectory);
        getDirsScanningMethod(directoriesInTheRootDirectoryList).accept(rootDirectory);

    }

    /**
     * 定义扫描到文件的存储策略
     * @param listToStoreFiles 扫描到的file的容器
     * @return 消耗函数consumer
     */
    abstract protected  Consumer<File> getFilesScanningMethod(List<File> listToStoreFiles);

    /**
     * 定义到扫描到dir的存储策略
     * @param listToStoreDirs dir的容器
     * @return 消耗函数consumer
     */
    abstract protected  Consumer<File> getDirsScanningMethod(List<File> listToStoreDirs);
    abstract public  List<File> getFilesInTheRootDirectoryList();
    abstract public List<File> getDirectoriesInTheRootDirectoryList();
    abstract public List<File> getFilesAndDirsInTheRootDirectoryList();
}
